
#!/bin/bash
#准备阶段
allItems=("pack" "build" "all" "help")
showHelp=0
echo "$@" | grep -wq "help" &&  showHelp=1 || showHelp=0
if [ ${showHelp} -eq 1 ]
then
echo "第一个参数值:"${allItems[@]}
echo "pack:  only copy ~/ros2_ws/install and running scripts"
echo "build: only build"
echo "all:   build and pack"
echo "第二个参数为存放待编译包信息的存放文件名:如packages-junYi.txt"
echo "only build example:       ./distribution-nodes-pack.sh build ./packages-junYi.txt"
echo "only pack example:        ./distribution-nodes-pack.sh pack ./packages-junYi.txt"
echo "build and pack example:   ./distribution-nodes-pack.sh all ./packages-junYi.txt"

exit 1
fi

#编译ros程序
funBdRosPack (){
cd ~/ros2_ws #切换到工作空间目录
colcon build --packages-select $1 #编译指定程序
status=$?
if [ ! $status -eq 0 ]
then
#编译失败给出提示 并结束执行打包、编译
  echo "colcon build --packages-select $1 failed" 
  exit 1
fi
}

#编译DDS程序
funBdDDS (){
#使用cmake进行编译，在指定目录编译 如不存在该目录则创建该目录
if [ ! -d ~/build/DDS2ROS ]
then
mkdir -p ~/build/DDS2ROS
fi
#切换到编译目录
cd ~/build/DDS2ROS
cp ~/DDS2ROS/nx/DDS2ROS/dds_profiles.xml ./ #将配置文件拷贝到编译目录
#开始进行编译
cmake ~/DDS2ROS/nx/DDS2ROS
make
}

#编译某个指定程序
funBuildOne (){
packpath=~/ros2_ws/src/$1 #初始化程序路径
#判定程序是ros程序还是DDS程序，ros使用ros2编译方式，DDS使用CMake编译方式
isros=1
if [ "$1" == "DDS2ROS" ]
then
#dds2ro2指定DDS程序位置
isros=0
packpath=~/DDS2ROS/nx/DDS2ROS
fi

#程序代码存在时已经是DDS或ROS程序进行不同的方式进行编译
if [ -d $packpath ]
then
echo "编译$packpath"
if [ $isros -eq 0 ]
then
  funBdDDS
else
  funBdRosPack $1
fi

else
#程序代码不存在时给出提示
echo "{packpath}不存在"

fi

}

#打包DDS程序，优先拷贝/usr/bin/目录下的DDS2ROS程序，如没有再拷贝～/build/DDS2ROS下的
funpackDDS (){
echo "复制DDS2ROS到 ./nodes"
if [ -f "/usr/bin/DDS2ROS" ]
then
 echo "拷贝/usr/bin/DDS2ROS到 ./nodes"
 cp /usr/bin/DDS2ROS ./nodes/
else
    echo "拷贝~/build/DDS2ROS/DDS2ROS到 ./nodes"
    cp ~/build/DDS2ROS/DDS2ROS ./nodes/
    cp ~/build/DDS2ROS/dds_profiles.xml ./nodes/

fi
}


#打包某个程序，依据程序是否是DDS程序进行不同的处理
funPackOne (){
  
  isros=1
  if [ "$1" == "DDS2ROS" ]
  then
    isros=0
  elif [ "$1" == "behavior-process" ]
  then
#为行为节点程序时需要拷贝行为数xml文件
      echo "复制ros2_ws/tree到 ./nodes/tree"
      cp -fr ~/ros2_ws/tree ./nodes
  fi

  if [ $isros -eq 1 ]
  then
#如为普通ros程序则直接拷贝install下对应文件即可
    cp -fr ~/ros2_ws/install/$1 ./nodes/install/
  else
    funpackDDS
  fi


}

#从待编译程序列表文件读取程序名
#每行代表一个程序名
#（程序名后以,结束）
#如行以#开头则忽略此程序编译
funBuildAll (){
if [ ! -d ~/ros2_ws/src ]
then
echo "packalist file:$1 not exist" #如程序代码目录不存在则退出执行脚本
exit 1
fi
isBuild=$2 #是否编译
isPack=$3  #是否打包
while read lne #读取列表中每行内容（程序名）
do
  line="${lne// /}"
  if [[ "$line" == "#"* ]] #是否以#开头
  then
  echo "skip $line" #如以#开头则跳过此程序的编译或打包
  else
  arr=(${line//,/ }) #获取程序名，文件中每行需要以,结束
  len=${#arr[@]}
  if [ $len -lt 1 ] #是否找到程序名，名需以，结束
  then
  echo "skip $line" #如没找到程序名则跳过此行操作
  continue
  fi
  echo "${arr[0]}"
  if [ $isBuild -eq 1 ] #判定是否需要编译此程序
  then
    funBuildOne ${arr[0]}
  fi
  if [ $isPack -eq 1 ] #判定是否需要打包此程序
  then
    funPackOne ${arr[0]}
  fi
  fi
done < $1

}

#创建目录存放程序
funInsDir (){
rm -fr ./nodes/install
rm -fr ./nodes/tree
if [ ! -d ./nodes/install ] #判定是否包含安装目录
then
mkdir -p ./nodes/install
fi
}

#echo "$@" | grep -wq "build" &&  build=1 || build=0
echo "$1"
if [ "$1" == "build" ] #如参数为build表示只编译，则编译完成后退出
then
funBuildAll $2 1 0
exit 1
elif [ "$1" == "all" ] #如参数为all表示编译并打包，则创建install目录并编辑、打包
then
funInsDir
funBuildAll $2 1 1
elif [ "$1" == "pack" ] #如参数为pack表示只打包，则创建install目录并打包
then
echo $2
funInsDir
funBuildAll $2 0 1
else
echo "unknow arg:$@" #参数错误时，给出提示信息
echo "全部可选参数:"${allItems[@]}
exit 1
fi


#echo "负责启动脚本到./nodes"
cp ~/droneyee_fly/realfly_startup.sh ./nodes/realfly_startup.sh
cp ~/droneyee_fly/check_restart.sh ./nodes/check_restart.sh 
cp ~/droneyee_fly/max_gpu_freq.sh ./nodes/max_gpu_freq.sh
cp ~/droneyee_fly/max_cpu_freq.sh ./nodes/max_cpu_freq.sh 

echo "拷贝mavros配置文件"
cp ~/ros2_ws/mavros_param_1.yaml ./nodes/mavros_param_1.yaml

version=""
echo "input version like 1.1.0.1"
read -p "version: " version

tar -czvf nodes.tar.gz nodes
cat ./distribution-nodes-install.sh nodes.tar.gz > distribution-nodes-install-"${version}".run

chmod +x distribution-nodes-install-"${version}".run

rm -fr nodes
rm -fr nodes.tar.gz
echo "打包完成"















